home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / share / et / et_c.awk next >
Text File  |  2005-10-13  |  6KB  |  267 lines

  1. BEGIN { 
  2. if ( length(outfn) == 0) {
  3.     outfn = outfile
  4. }
  5. char_shift=64
  6. ## "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
  7. c2n["A"]=1
  8. c2n["B"]=2
  9. c2n["C"]=3
  10. c2n["D"]=4
  11. c2n["E"]=5
  12. c2n["F"]=6
  13. c2n["G"]=7
  14. c2n["H"]=8
  15. c2n["I"]=9
  16. c2n["J"]=10
  17. c2n["K"]=11
  18. c2n["L"]=12
  19. c2n["M"]=13
  20. c2n["N"]=14
  21. c2n["O"]=15
  22. c2n["P"]=16
  23. c2n["Q"]=17
  24. c2n["R"]=18
  25. c2n["S"]=19
  26. c2n["T"]=20
  27. c2n["U"]=21
  28. c2n["V"]=22
  29. c2n["W"]=23
  30. c2n["X"]=24
  31. c2n["Y"]=25
  32. c2n["Z"]=26
  33. c2n["a"]=27
  34. c2n["b"]=28
  35. c2n["c"]=29
  36. c2n["d"]=30
  37. c2n["e"]=31
  38. c2n["f"]=32
  39. c2n["g"]=33
  40. c2n["h"]=34
  41. c2n["i"]=35
  42. c2n["j"]=36
  43. c2n["k"]=37
  44. c2n["l"]=38
  45. c2n["m"]=39
  46. c2n["n"]=40
  47. c2n["o"]=41
  48. c2n["p"]=42
  49. c2n["q"]=43
  50. c2n["r"]=44
  51. c2n["s"]=45
  52. c2n["t"]=46
  53. c2n["u"]=47
  54. c2n["v"]=48
  55. c2n["w"]=49
  56. c2n["x"]=50
  57. c2n["y"]=51
  58. c2n["z"]=52
  59. c2n["0"]=53
  60. c2n["1"]=54
  61. c2n["2"]=55
  62. c2n["3"]=56
  63. c2n["4"]=57
  64. c2n["5"]=58
  65. c2n["6"]=59
  66. c2n["7"]=60
  67. c2n["8"]=61
  68. c2n["9"]=62
  69. c2n["_"]=63
  70. }
  71. /^#/ { next }
  72. /^[ \t]*(error_table|et)[ \t]+[a-zA-Z][a-zA-Z0-9_]+/ {
  73.     table_number = 0
  74.     mod_base = 1000000
  75.     if (NF > 2) {
  76.         table_name = $3
  77.         base_name = $2
  78.     } else {
  79.         table_name = $2
  80.         base_name = table_name
  81.     }
  82.     for(i=1; i<=length(base_name); i++) {
  83.         table_number=(table_number*char_shift)+c2n[substr(base_name,i,1)]
  84.     }
  85.  
  86.     # We start playing *_high, *low games here because the some
  87.     # awk programs do not have the necessary precision (sigh)
  88.     tab_base_low = table_number % mod_base
  89.     if (tab_base_low < 0) {
  90.         # Work around stupid bug in the ARM libm
  91.         tab_base_low = tab_base_low + mod_base
  92.     }
  93.     tab_base_high = int(table_number / mod_base)
  94.     tab_base_sign = 1;
  95.  
  96.     # figure out: table_number_base=table_number*256
  97.     tab_base_low = tab_base_low * 256
  98.     tab_base_high = (tab_base_high * 256) + \
  99.             int(tab_base_low / mod_base)
  100.     tab_base_low = tab_base_low % mod_base
  101.     if (tab_base_low < 0) {
  102.         # Work around stupid bug in the ARM libm
  103.         tab_base_low = tab_base_low + mod_base
  104.     }
  105.  
  106.     if (table_number > 128*256*256) {
  107.         # figure out:  table_number_base -= 256*256*256*256
  108.         # sub_high, sub_low is 256*256*256*256
  109.         sub_low = 256*256*256 % mod_base
  110.         sub_high = int(256*256*256 / mod_base)
  111.  
  112.         sub_low = sub_low * 256
  113.         sub_high = (sub_high * 256) + int(sub_low / mod_base)
  114.         sub_low = sub_low % mod_base
  115.  
  116.         tab_base_low = sub_low - tab_base_low;
  117.         tab_base_high = sub_high - tab_base_high;
  118.         tab_base_sign = -1;
  119.         if (tab_base_low < 0) {
  120.             tab_base_low = tab_base_low + mod_base
  121.             tab_base_high--
  122.         }
  123.     }
  124.     print "/*" > outfile
  125.     print " * " outfn ":" > outfile
  126.     print " * This file is automatically generated; please do not edit it." > outfile
  127.     print " */" > outfile
  128.  
  129.     print "" > outfile
  130.     print "#include <stdlib.h>" > outfile
  131.     print "" > outfile
  132.     print "static const char * const text[] = {" > outfile
  133.     table_item_count = 0
  134. }
  135.  
  136. (continuation == 1) && ($0 ~ /\\[ \t]*$/) {
  137.     text=substr($0,1,length($0)-1);
  138. #    printf "\t\t\"%s\"\n", text > outfile
  139.     cont_buf=cont_buf text;
  140. }
  141.  
  142. (continuation == 1) && ($0 ~ /"[ \t]*$/) {
  143. #    printf "\t\t\"%s,\n", $0 > outfile
  144.     printf "\t%s,\n", cont_buf $0 > outfile
  145.     continuation = 0;
  146. }
  147.  
  148. /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[^ \t]/ {
  149.     # Be tolerant to missing whitespace after `,' ...
  150.     sub(/,/, ", ")
  151. }
  152.  
  153. /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*$/ {
  154.     table_item_count++
  155.     skipone=1
  156.     next
  157. }
  158.  
  159. /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*".*"[ \t]*$/ {
  160.     text=""
  161.     for (i=3; i<=NF; i++) { 
  162.         text = text FS $i
  163.     }
  164.     text=substr(text,2,length(text)-1);
  165.     printf "\t%s,\n", text > outfile
  166.     table_item_count++
  167. }
  168.  
  169. /^[ \t]*(error_code|ec)[ \t]+[A-Z_0-9]+,[ \t]*".*\\[ \t]*$/ {
  170.     text=""
  171.     for (i=3; i<=NF; i++) { 
  172.         text = text FS $i
  173.     }
  174.     text=substr(text,2,length(text)-2);
  175. #    printf "\t%s\"\n", text > outfile
  176.     cont_buf=text
  177.     continuation++;
  178. }
  179.  
  180. /^[ \t]*".*\\[ \t]*$/ {
  181.     if (skipone) {
  182.         text=substr($0,1,length($0)-1);
  183. #        printf "\t%s\"\n", text > outfile
  184.         cont_buf=text
  185.         continuation++;
  186.     }
  187.     skipone=0
  188. }
  189.  
  190.     if (skipone) {
  191.         printf "\t%s,\n", $0 > outfile
  192.     }
  193.     skipone=0
  194. }
  195.  
  196. /^[ \t]*(prefix)$/ {
  197.     prefix_str = ""
  198. }
  199.  
  200. /^[ \t]*(prefix)[ \t]+[A-Z_0-9]+/ {
  201.     prefix_str = $2 "_"
  202. }
  203.  
  204. /^[ \t]*(index)[ \t]+[A-Z_0-9]+/ {
  205.     new_idx = $2
  206.     for (i = table_item_count ; i < new_idx; i++) {
  207.         printf "\t\"Reserved %s error (%d)\",\n", \
  208.             table_name, table_item_count++ > outfile
  209.     }
  210. }
  211.  
  212. END {
  213.     print "    0" > outfile
  214.     print "};" > outfile
  215.     print "" > outfile
  216.     print "struct error_table {" > outfile
  217.     print "    char const * const * msgs;" > outfile
  218.     print "    long base;" > outfile
  219.     print "    int n_msgs;" > outfile
  220.     print "};" > outfile
  221.     print "struct et_list {" > outfile
  222.     print "    struct et_list *next;" > outfile
  223.     print "    const struct error_table * table;" > outfile
  224.     print "};" > outfile
  225.     print "extern struct et_list *_et_list;" > outfile
  226.     print "" > outfile
  227.     if (tab_base_high == 0) {
  228.         print "const struct error_table et_" table_name "_error_table = { text, " \
  229.         sprintf("%dL, %d };", tab_base_sign*tab_base_low, \
  230.         table_item_count) > outfile
  231.     } else {
  232.         print "const struct error_table et_" table_name "_error_table = { text, " \
  233.         sprintf("%d%06dL, %d };", tab_base_sign*tab_base_high, \
  234.         tab_base_low, table_item_count) > outfile
  235.     }
  236.     print "" > outfile
  237.     print "static struct et_list link = { 0, 0 };" > outfile
  238.     print "" > outfile
  239.     print "void initialize_" table_name "_error_table_r(struct et_list **list);" > outfile
  240.     print "void initialize_" table_name "_error_table(void);" > outfile
  241.     print "" > outfile
  242.     print "void initialize_" table_name "_error_table(void) {" > outfile
  243.     print "    initialize_" table_name "_error_table_r(&_et_list);" > outfile
  244.     print "}" > outfile
  245.     print "" > outfile
  246.     print "/* For Heimdal compatibility */" > outfile
  247.     print "void initialize_" table_name "_error_table_r(struct et_list **list)" > outfile
  248.     print "{" > outfile
  249.     print "    struct et_list *et, **end;" > outfile
  250.     print "" > outfile
  251.     print "    for (end = list, et = *list; et; end = &et->next, et = et->next)" > outfile
  252.     print "        if (et->table->msgs == text)" > outfile
  253.     print "            return;" > outfile
  254.     print "    et = malloc(sizeof(struct et_list));" > outfile
  255.     print "    if (et == 0) {" > outfile
  256.     print "        if (!link.table)" > outfile
  257.     print "            et = &link;" > outfile
  258.     print "        else" > outfile
  259.     print "            return;" > outfile
  260.     print "    }" > outfile
  261.     print "    et->table = &et_" table_name "_error_table;" > outfile
  262.     print "    et->next = 0;" > outfile
  263.     print "    *end = et;" > outfile
  264.     print "}" > outfile
  265. }
  266.